Electioneering: Part III

Final part a three-part series looking at how the composition of the Australian Federal parliament might vary under different electoral systems.

In this part, we conduct a comparative analysis of each voting system.

R
auspol
Published

November 9, 2023

In part II, we determined the makeup of parliament under the three different systems. In this part, we’ll reframe these results so we can perform a side-to-side analysis and draw some reasonable inferences.

Due to the presence of list seats in an MMP system, looking at electorates alone elides the comparative advantage of the MMP system. For this reason, I’ve broken this section into two subsections: the first determines the total composition of parliament under each of FPTP, MMP, and STV, whilst the second compares the winners of electorates under FFP and STV.

Composition by Party

compare.parliament = votes %>%
  group_by(PartyAb) %>%
  filter(CountNumber == 0) %>%
  summarise(partyVoteN = sum(prefCount)) %>%
  mutate(partyVotePC = (partyVoteN / sum(partyVoteN)) %>%
           multiply_by(100) %>%
           round(digits = 2)) %>%
  # Join to MMP
  full_join(mmp %>%
              select(PartyAb,
                     mmpElecSeatsN = seatsElecN,
                     mmpListSeatsN = seatsListN,
                     mmpTotSeatsN = seatsTotalN,
                     mmpTotSeatsPC = seatsTotalPC)) %>%
  # Join to STV
  full_join(stv %>%
              group_by(PartyAb) %>%
              summarise(stvSeatsN = n())) %>%
  # Join to FPTP
  full_join(fptp %>%
              group_by(PartyAb) %>%
              summarise(fptpSeatsN = n())) %>%
  # Tidy up the missing
  mutate(across(c(stvSeatsN, fptpSeatsN), ~ ifelse(is.na(.), 0, .)),
         stvSeatsPC = (stvSeatsN / sum(stvSeatsN)) %>%
                  multiply_by(100) %>%
                  round(digits = 2),
         fptpSeatsPC = (fptpSeatsN / sum(fptpSeatsN)) %>%
           multiply_by(100) %>%
           round(digits = 2)) %>%
  # Difference from party vote
  mutate(across(ends_with("SeatsPC"), ~ . - partyVotePC, .names = "{.col}_diff"))
Comparison of Parliament Under Three Voting Systems
Australian Federal Election 2022
Party Party Vote (%) Mixed Member Proportional Single Transferrable Vote First Past the Post
Seats (n) Seats (%) Deviance (%) Seats (n) Seats (%) Deviance (%) Seats (n) Seats (%) Deviance (%)
ALP 32.58 81 36.65 4.07 77 50.99 18.41 71 47.02 14.44
LP 23.89 59 26.70 2.81 27 17.88 -6.01 40 26.49 2.60
GRN 12.25 31 14.03 1.78 4 2.65 -9.60 2 1.32 -10.93
LNP 8.00 23 10.41 2.41 21 13.91 5.91 23 15.23 7.23
IND 5.30 3 1.36 -3.94 10 6.62 1.32 3 1.99 -3.31
ON 4.96 12 5.43 0.47 0 0.00 -4.96 0 0.00 -4.96
UAPP 4.12 0 0.00 -4.12 0 0.00 -4.12 0 0.00 -4.12
NP 3.60 10 4.52 0.92 10 6.62 3.02 10 6.62 3.02
LDP 1.73 0 0.00 -1.73 0 0.00 -1.73 0 0.00 -1.73
AJP 0.60 0 0.00 -0.60 0 0.00 -0.60 0 0.00 -0.60
CYA 0.39 0 0.00 -0.39 0 0.00 -0.39 0 0.00 -0.39
KAP 0.38 1 0.45 0.07 1 0.66 0.28 1 0.66 0.28
XEN 0.25 1 0.45 0.20 1 0.66 0.41 1 0.66 0.41
WAP 0.23 0 0.00 -0.23 0 0.00 -0.23 0 0.00 -0.23
GAP 0.21 0 0.00 -0.21 0 0.00 -0.21 0 0.00 -0.21
Deviance is the percentage difference between the proportion of seats held compared to the 1st preference vote.
NB: Parties receiving less than 30,000 votes are not displayed.

Composition by Electorates

compare.seat = full_join(
  stv %>%
    mutate(name = paste(GivenNm, Surname)) %>%
    select(StateAb, DivisionNm,
           stvID = CandidateID, stvName = name, stvParty = PartyAb, stvCount = prefCount, stvMargin = margin),
  fptp %>%
    mutate(name = paste(GivenNm, Surname)) %>%
    select(StateAb, DivisionNm,
           fptpID = CandidateID, fptpName = name, fptpParty = PartyAb, fptpCount = prefCount, fptpMargin = margin),
  by = c("StateAb", "DivisionNm")) %>%
  mutate(identical = ifelse(stvID == fptpID, TRUE, FALSE)) %>%
  select(-c(stvID, fptpID))
Comparison of Electorates with Differing Outcomes Under STV and FPTP
Australian Federal Election 2022
State Single Transferable Vote First Past the Post
Elected Member Party Votes (n) Margin (n) Elected Member Party Votes (n) Margin (n)
Bennelong NSW Jerome LAXALE ALP 50,801.00 1,954.00 Simon KENNEDY LP 41,206.00 3,610.00
Boothby SA Louise MILLER-FROST ALP 60,579.00 7,451.00 Rachel SWIFT LP 43,196.00 6,450.00
Brisbane QLD Stephen BATES GRN 58,460.00 8,122.00 Trevor EVANS LNP 41,032.00 11,380.00
Curtin WA Kate CHANEY IND 53,847.00 2,657.00 Celia HAMMOND LP 43,408.00 12,466.00
Fowler NSW Dai LE IND 44,348.00 2,793.00 Kristina KENEALLY ALP 30,973.00 5,627.00
Gilmore NSW Fiona PHILLIPS ALP 56,039.00 373.00 Andrew CONSTANCE LP 46,941.00 6,766.00
Goldstein VIC Zoe DANIEL IND 51,861.00 5,635.00 Tim WILSON LP 39,607.00 5,792.00
Higgins VIC Michelle ANANDA-RAJAH ALP 49,726.00 3,941.00 Katie ALLEN LP 38,859.00 11,672.00
Kooyong VIC Monique RYAN IND 54,276.00 6,035.00 Josh FRYDENBERG LP 43,736.00 2,433.00
Lyons TAS Brian MITCHELL ALP 37,341.00 1,344.00 Susie BOWER LP 27,296.00 6,001.00
Mackellar NSW Sophie SCAMPS IND 51,973.00 4,955.00 Jason FALINSKI LP 40,993.00 3,269.00
North Sydney NSW Kylea Jane TINK IND 51,392.00 5,666.00 Trent ZIMMERMAN LP 36,956.00 12,479.00
Robertson NSW Gordon REID ALP 50,277.00 4,344.00 Lucy WICKS LP 38,448.00 2,217.00
Ryan QLD Elizabeth WATSON-BROWN GRN 52,286.00 5,256.00 Julian SIMMONDS LNP 38,239.00 8,236.00
Tangney WA Sam LIM ALP 56,331.00 5,114.00 Ben MORTON LP 43,008.00 2,068.00
Wentworth NSW Allegra SPENDER IND 48,186.00 7,449.00 Dave SHARMA LP 35,995.00 4,185.00

Electoral Maps